package 双指针或滑动窗口.半径为k的子数组平均值2090;

import java.util.Arrays;

public class Solution {
    /**
     * 计算数组中每个元素的滑动窗口平均值
     * 滑动窗口大小为 2k+1，对于每个元素 nums[i]，计算从 nums[i-k] 到 nums[i+k] 的平均值
     * 如果元素周围的数字不足 k 个，则该元素的平均值为 -1
     *
     * @param nums 原始整数数组
     * @param k    窗口半径，决定滑动窗口的大小为 2k+1
     * @return 每个元素的滑动窗口平均值组成的数组
     */
    public int[] getAverages(int[] nums, int k) {
        int n = nums.length;
        int[] avgs = new int[n];
        Arrays.fill(avgs, -1);
        long s = 0; // 维护窗口元素和
        for (int i = 0; i < n; i++) {
            // 1. 进入窗口
            s += nums[i];
            if (i < k * 2) { // 窗口大小不足 2k+1
                continue;
            }
            // 2. 记录答案
            avgs[i - k] = (int) (s / (k * 2 + 1));
            // 3. 离开窗口
            s -= nums[i - k * 2];
        }
        return avgs;
    }

}
